package util.exact;

import bean.State;
import bean.Task;
import bean.Worker;

import java.util.HashSet;

public class DecomposeWorkerStates {

    /**
     * 此方法用来分解一个工人的cover state
     * 例如w1技能为{e1,e2},价格为2.0，能力为1
     * 因此分解后的的cover state为<{e1}, {w1}, 2.0>，<{e2}, {w1}, 2.0>
     * attention!!只有工人的技能是任务所需要的才加入cover state
     * @param worker 一个工人
     * @return cover state
     */
    public static HashSet<State> decomposeWorkerStates(Worker worker, Task task) {

        /*
        TODO 此方法不完整，现在只是考虑到一种情况，即：worker的capacity为1，
         因此为此worker的每一个技能（且被任务需要的技能）分解为一个state。
         还有其他情况没有考虑：w3的技能数量为2，capacity也为2，因此他只需要一种state
         */
        HashSet<State> states = new HashSet<>();
        int capacity = worker.getCapacity();

        if ( capacity == 1 ) {
            /*
            capacity==1 的时候，需要把此工人的每个技能都创建一个state
             */
            //首先根据当前worker的技能数量，创建state的数量
            //现在每个state只包含一个技能
            if ( worker.getSkills().size() != 0 ) {
                for (String skill : worker.getSkills()) {
                    if ( IsNeededByTask.isNeededByTask(skill,task) ) {
                        State state = new State();
                        HashSet<String> skills = new HashSet<>();
                        skills.add(skill);
                        state.setSkills(skills);
                        states.add(state);
                    }
                }
            }
            //为上面创建好的每一个state设置worker集合、成本
            if ( states.size() != 0 ) {
                for (State state : states) {
                    //设置workers集合，此集合只包含一个worlker
                    HashSet<Worker> workers = new HashSet<>();
                    workers.add(worker);
                    state.setWorkers(workers);
                    state.setCost(worker.getPayoff());
                }
            }
        } else {
            /*
            由于现在每个工人最多只有两个技能，因此当capacity==2时，技能数也等于2，其他情况先不考虑
             */
            //此时 HashSet<State> states 中包含一个state，skills有两个技能，即工人的两个技能，workers包含一个工人，即当前工人
            HashSet<String> skills = new HashSet<>();
            skills = worker.getSkills();
            HashSet<Worker> workers = new HashSet<>();
            workers.add(worker);
            State state = new State();
            state.setSkills(skills);
            state.setWorkers(workers);
            state.setCost(worker.getPayoff());
            states.add(state);
        }

        return states;
    }

}
